package com.index;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Set;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import twitter4j.Status;

import com.wutka.jox.JOXBeanInputStream;

/**
 * Clase Encargada de crear el índice.
 * 
 * @author $author$
 * @version $Revision$
 */
public class Indexer {
	/**
	 * Lugar en donde se almacena el índice.<BR>
	 */
	static final File INDEX_DIR = new File("resources/index");

	/**
	 * Creates a new Indexer object.
	 */
	public Indexer() {

	}

	/**
	 * Este metodo recupera los ultimos tweets, crea un Document por cada uno y
	 * lo agrega al indexador
	 * 
	 * @param writer
	 *            indexador
	 * @throws CorruptIndexException
	 * @throws IOException
	 */
	private void indexDocuments(IndexWriter writer)
			throws CorruptIndexException, IOException {

		FileInputStream fIn = new FileInputStream("conf/index.xml");

		JOXBeanInputStream joIn = new JOXBeanInputStream(fIn);

		Configuration conf = (Configuration) joIn
				.readObject(Configuration.class);

		Set<Status> publicTimelineTweets = TwitterGetter.getTweets(conf);

		// recorre todos los tweets y los va a agregando
		for (Status tweets : publicTimelineTweets) {
			writer.addDocument(FileDocument.Document(tweets));
		}
	}

	/**
	 * Crea el nuevo indice a partir de tweets
	 */
	public void index() {
		IndexWriter writer = null;

		try {

			writer = new IndexWriter(FSDirectory.open(INDEX_DIR),
					new StandardAnalyzer(Version.LUCENE_30), true,
					IndexWriter.MaxFieldLength.LIMITED);

		} catch (IOException ioException) {
			System.out.println("Algo mal con la ruta de archivos");
		}

		if (writer != null) {
			try {

				this.indexDocuments(writer);
				writer.optimize();
				writer.close();
				System.out
						.println("Indice creado correctamente en: " + INDEX_DIR);

			} catch (IOException ioException) {
				// TODO: manejar esta excepcion
				System.out
						.println("Paso algo muy muy malo al cerrar el indice");
				ioException.printStackTrace();
			}
		}
	}
}